package org.jamailia.core.ssl;

import org.apache.log4j.Logger;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

import javax.net.SocketFactory;
import javax.net.ssl.*;

import org.jamailia.core.ssl.TrustAlwaysManager;


/**
 * JamailiaSSLSocketFactory is a totally basic soccket factory to help us avoiding to deal with keystore.
 */
public class JamailiaSSLSocketFactory extends SSLSocketFactory {

    private static final Logger LOG = Logger.getLogger(JamailiaSSLSocketFactory.class);

    private SSLSocketFactory factory;

    public JamailiaSSLSocketFactory() {
        try {
            SSLContext sslcontext = SSLContext.getInstance("TLS");
            sslcontext.init(null,
                    new TrustManager[]{new TrustAlwaysManager()},
                    null);
            factory = (SSLSocketFactory) sslcontext.getSocketFactory();
        } catch ( Exception ex ) {
            LOG.error("JamailiaSSLSocketFactory - [JamailiaSSLSocketFactory]: Exception catched: ", ex);
        }
    }

    public static SocketFactory getDefault() {
        return new JamailiaSSLSocketFactory();
    }

    public Socket createSocket() throws IOException {
        return factory.createSocket();
    }

    public Socket createSocket( Socket socket, String s, int i, boolean flag )
            throws IOException {
        return factory.createSocket(socket, s, i, flag);
    }

    public Socket createSocket( InetAddress inaddr, int i,
                                InetAddress inaddr1, int j ) throws IOException {
        return factory.createSocket(inaddr, i, inaddr1, j);
    }

    public Socket createSocket( InetAddress inaddr, int i )
            throws IOException {
        return factory.createSocket(inaddr, i);
    }

    public Socket createSocket( String s, int i, InetAddress inaddr, int j )
            throws IOException {
        return factory.createSocket(s, i, inaddr, j);
    }

    public Socket createSocket( String s, int i ) throws IOException {
        return factory.createSocket(s, i);
    }

    public String[] getDefaultCipherSuites() {
        return factory.getDefaultCipherSuites();
    }

    public String[] getSupportedCipherSuites() {
        return factory.getSupportedCipherSuites();
    }
}
